Q2. 前の問題で作ったaから、次のように5列目以降に入らない数字を書き込んだファイルbを作ってください。入らない数字は重複を除去しなくて構いません
前の問題で作ったaから、次のように5列目以降に入らない数字を書き込んだファイルbを作ってください。入らない数字は重複を除去しなくて構いません
code:bash
$ head b
0 0 0 5
0 1 0 3
0 2 0 * 5 3 7 6 9 8
0 3 1 * 5 3 7 1 9 5 8 4
0 4 1 7
0 5 1 * 5 3 7 1 9 5 3 9
0 6 2 * 5 3 7 6 2
0 7 2 * 5 3 7 6 8 7
0 8 2 * 5 3 7 6 3 1 6 5 9
1 0 0 6
解けなかった
数読的に考えるなら同じ行、同じ列、同じ区画に存在する文字の一覧を取得してユニークにし、数字だけとりだすのが正攻法だと思う
というわけで愚直に書いた
code:nums.bash
cat a | while read -r a b c d; do echo -n "$a $b $c $d "; awk -v a=$a -v b=$b -v c=$c -v d=$d 'd == "*" && ($1==a || $2==b || $3==c) && $4!="*" {print $4}' a | sed -E "s/$/ /" | tr -d \\n; echo; done | sed -E "s/ $//g"
もうちょい見やすくした
code:nums2.sh
cat a |
while read -r a b c d; do
echo -n "$a $b $c $d "
awk \
-v a=$a \
-v b=$b \
-v c=$c \
-v d=$d \
'd == "*" && ($1==a || $2==b || $3==c) && $4!="*" {print $4}' a |
sed -E "s/$/ /" |
tr -d \\n
echo
done |
sed -E "s/ $//g"
やってることはデータの総当り
1行ずつループして、aファイルの全レコードを毎回判定して該当するものだけを1行に結合して出力
4番目のフィールドを出力する条件は以下
検査するのは検査に使う入力のレコードの4番目のフィールドが*
かつ入力と検査先の1番目のフィールドが同じ
あるいは入力と検査先の2番目のフィールドが同じ
あるいは入力と検査先の3番目のフィールドが同じ
かつ検査先の4番目のフィールドが*でない
見直して見ると愚直にやれば普通に解けたな
なんで勉強会の時は解けなかったんだろう